package com.szjz.elasticsearch.eshelper.base.wrapper.service;



import com.szjz.elasticsearch.eshelper.page.Page;
import com.szjz.elasticsearch.eshelper.wrapper.ESQueryWrapper;

import java.io.IOException;
import java.util.Date;
import java.util.List;


/**
 * @author 史博
 * @desc 主要是通过wrapper 包装实现查询
 * @date 2021/1/19 下午4:53 周二
 */
public interface WrapperService<T> extends MapWrapperService<T>{


	/**
	 * 查询所有
	 * 当数据量大的时候不建议使用该方法
	 *
	 * @return 数据集合
	 */
	List<T> selectAll();

	/**
	 * 通过包装类查询集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @return 数据集合
	 */
	List<T> select(ESQueryWrapper<T> wrapper);

	/**
	 * 通过包装类查询按天分片的索引库集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @param date    索引库对应的分片时间
	 * @return 某一天的数据集合
	 * @see DayWrapperService#selectAcDay(ESQueryWrapper, Date)
	 */
	@Deprecated
	List<T> select(ESQueryWrapper<T> wrapper, Date date);

	/**
	 * 通过包装类查询按天分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @return 某一时间段的数据集合
	 * @see DayWrapperService#selectAcDay(ESQueryWrapper, Date, Date)
	 */
	@Deprecated
	List<T> select(ESQueryWrapper<T> wrapper, Date startDate, Date endDate);

	/**
	 * 通过包装类查询集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @param size    返回结果集的最大数量
	 * @return 数据集合
	 */
	List<T> select(ESQueryWrapper<T> wrapper, Integer size);

	/**
	 * 通过包装类查询按天分片的索引库集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @param date    索引库对应的分片时间
	 * @param size    返回结果集的最大数量
	 * @return 某一天的数据集合
	 * @see DayWrapperService#selectAcDay(ESQueryWrapper, Date, Integer)
	 */
	@Deprecated
	List<T> select(ESQueryWrapper<T> wrapper, Date date, Integer size);

	/**
	 * 通过包装类查询按天分片的索引库集合
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @param size      返回结果集的最大数量
	 * @return 某一时间段的数据集合
	 * @see DayWrapperService#selectAcDay(ESQueryWrapper, Date, Date, Integer)
	 */
	@Deprecated
	List<T> select(ESQueryWrapper<T> wrapper, Date startDate, Date endDate, Integer size);

	/**
	 * 分页查询-通过包装类查询集合
	 *
	 * @param wrapper  将要查询的条件封装到wrapper中
	 * @param pageNum  当前页
	 * @param pageSize 每页容量大小
	 * @return
	 */
	Page<T> page(ESQueryWrapper<T> wrapper, Integer pageNum, Integer pageSize);

	/**
	 * 分页查询-通过包装类查询集合
	 * 适用于按天分片
	 *
	 * @param wrapper  将要查询的条件封装到wrapper中
	 * @param date     时间
	 * @param pageNum  当前页
	 * @param pageSize 每页容量大小
	 * @return 分页数据
	 */
	Page<T> page(ESQueryWrapper<T> wrapper, Date date, Integer pageNum, Integer pageSize);

	/**
	 * 分页查询-通过包装类查询集合
	 * 适用于按天分片
	 *
	 * @param wrapper   将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @param pageNum   当前页
	 * @param pageSize  每页容量大小
	 * @return 分页数据
	 */
	Page<T> page(ESQueryWrapper<T> wrapper, Date startDate, Date endDate, Integer pageNum, Integer pageSize);

	/**
	 * 通过包装类删除集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @return
	 */
	Long delete(ESQueryWrapper<T> wrapper);

	/**
	 * 通过包装类删除集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @return
	 */
	Long deleteAcDay(ESQueryWrapper<T> wrapper, Date startDate, Date endDate);

	/**
	 * 通过包装类删除集合
	 *
	 * @param wrapper 将要查询的条件封装到wrapper中
	 * @param startDate 开始时间
	 * @param endDate   结束时间
	 * @return
	 */
	Long deleteAcMouth(ESQueryWrapper<T> wrapper, Date startDate, Date endDate) throws IOException;

	/**
	 * count
	 * 可用于非等查询
	 *
	 * @param wrapper 将要查询的条件封装到ESQueryWrapper中
	 * @return
	 */
	Long count(ESQueryWrapper<T> wrapper);


}
